package demo4

/*
	类型与接口的关系
		1. 在 Go语言中类型和接口之间有一对多和多对一的关系，
*/

/* demo1 */
// socket
type socket struct{}

// sockert -- write
func (s *socket) write(p []byte) (n int, err error) {
	return 0, nil
}

// socket -- close
func (s *socket) close() error {
	return nil
}

// writer 接口
type writer1 interface {
	write(p []byte) (n int, err error)
}

// closer 接口
type closer1 interface {
	close() error
}

// tips: usingWriter() 和 usingCloser() 完全独立，互相不知道对方的存在，也不知道自己使用的接口是 Socket 实现的。
// 使用io.Writer的代码, 并不知道Socket和io.Closer的存在
func usingWriter(writer writer1) {
	writer.write(nil)
}

// 使用io.Closer, 并不知道Socket和io.Writer的存在
func usingCloser(closer closer1) {
	closer.close()
}

// TestDemo43 类型与接口的关系
func TestDemo43() {
	/*
		demo1: 一个类型可以实现多个接口
		  1. socket 结构体实现了 writer1， closer1 接口
	*/
	// 实例化 socket
	s := new(socket)

	usingWriter(s)
	usingCloser(s)
}
